package behavior.observer;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author lzp
 * @Date:2023/3/7
 * @description: 仓储，存储产品
 */
public class Store {

	/**
	 * 观察产品存储情况的用户
	 */
	private List<ProductObserver> observers = new ArrayList<>();

	/**
	 * 当前产品
	 */
	private Map<String, Product> products = new HashMap<>();

	/**
	 * 这里直接创建一个线程池，用于处理异步发送订阅的情况
	 */
	private ExecutorService executorService = Executors.newFixedThreadPool(5);


	/**
	 * 注册观察者
	 *
	 * @param observer 观察者实现类
	 */
	public void addObserver(ProductObserver observer) {
		this.observers.add(observer);
	}

	/**
	 * 移除观察者
	 *
	 * @param observer
	 * @return
	 */
	public boolean removeObserver(ProductObserver observer) {
		return this.observers.remove(observer);
	}

	/**
	 * 添加新的产品
	 *
	 * @param name  产品名称
	 * @param price 产品价格
	 * @param async 是否异步通知
	 */
	public void addNewProduct(String name, double price, boolean async) {
		Product product = new Product(name, price);
		products.put(name, product);
		// 通知观察者
		this.observers.forEach(o -> {
			if (async) {
				// 异步通知订阅者
				executorService.execute(() -> o.onPublished(product));
			} else {
				o.onPublished(product);
			}
		});
	}

	/**
	 * 调整产品价格
	 *
	 * @param name  产品名称
	 * @param price 产品价格
	 * @param async 是否异步通知
	 */
	public void setProduct(String name, double price, boolean async) {
		Product product = new Product(name, price);
		products.put(name, product);
		// 通知观察者
		this.observers.forEach(o -> {
			if (async) {
				// 异步通知订阅者
				executorService.execute(() -> o.onPriceChange(product));
			} else {
				o.onPriceChange(product);
			}
		});
	}

}
